/**
 * Created by zhangqi on 2015/7/6.
 */

define(function(require,exports,module){
    require("commonStaticDirectory/plugins/artDialog/ui-dialog.css"); //artDialog弹窗
    require("commonStaticDirectory/plugins/artDialog/dialog-plus");  //artDialog弹窗
    var Ajax = require("commonStaticDirectory/plugins/ajax");
    require("commonStaticDirectory/plugins/webuploader/webuploader");

    var FileUpload = function(){
        this.init.apply(this,arguments);
    };

    FileUpload.prototype = {
        /** 构造函数 */
        constructor: FileUpload,
        /*默认的配置*/
        options: {
             url:""
        },
        /**
         * 初始化函数
         * */
        init: function (options) {
            $.extend(true,this.options,options); //合并配置参数
            this.initDom();
        },
        initDom:function(){
            var t = this;
            var _html = '' +
                '<div class="base_file_upload clearfix">' +
                '    <div class="base_file_upload_btns">'+
                '        <div id="base_file_upload_btn1" class="flat-button flat-medium flat-yellow">选择文件</div>'+
                '    </div>' +
                '    <div class="base_file_upload_list clearfix"></div> ' +
                '</div>';
            t.dialog = dialog({
                title:"附件上传",
                ok:function(){
                    if(!$(".base_file_upload_list").find(".base_file_upload_list_item").length){
                        layer.msg("请先选择文件", {offset: 0,shift:6});
                        return false;
                    }
                    t.uploader && t.uploader.upload();
                    return false;
                },
                okValue:"开始上传",
                cancel:function(){},
                content:_html
            });
            t.dialog.showModal(); //锁屏弹出
            t.$el = $(".base_file_upload");
            t.initWebuploader() //初始化上传控件
        },
        initWebuploader:function(){
            var t = this;
            var $list = t.$el.find(".base_file_upload_list");
            var iNum = 0; //被添加的文件个数
            var iSuccess = 0; //成功的文件数
            t.uploader = WebUploader.create({
                // 选完文件后，是否自动上传。
                auto: false,
                // swf文件路径
                swf: gMain.basePath+'static/js/base/plugins/webuploader/Uploader.swf',
                // 文件接收服务端。
                server: t.options.url,
                formData:{
                    codeId: t.options.codeId,
                    codeSetId: t.options.specialTabParam,
                    infoSetId: t.options.infoSetId
                }, //请求的参数列表
                headers:{
                    "X-Requested-With":"XMLHttpRequest"
                },
                // 选择文件的按钮。可选。
                // 内部根据当前运行是创建，可能是input元素，也可能是flash.
                pick: '#base_file_upload_btn1',
                // 只允许选择图片文件。
                //accept: {},  //此处过滤格式的json对象不能留空{},或者要直接去掉，否则报错
                disableGlobalDnd: true, // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候，把图片打开。
                duplicate:true, //去重
                fileNumLimit: 20 //,  //单次最多可选20张
                /*fileSizeLimit: 20 * 1024 * 1024,    // 200 M
                 fileSingleSizeLimit: 1024 * 1024    // 1 M*/
            });

            t.uploader.on( 'fileQueued', function( file ) {  //当文件被加入队列以后触发。
                iNum++;
                var $li = $(
                    '<div id="' + file.id + '" class="base_file_upload_list_item"> '+
                    '   <div class="base_file_upload_list_title">'+file.name+'</div>'+
                    '   <div class="base_file_upload_list_progress">'+
                    '       <div class="base_file_upload_list_progress_gray"></div>'+
                    '       <div class="base_file_upload_list_progress_green"></div>'+
                    '   </div>' +
                    '   <div class="base_file_upload_list_info">' +
                    '       <span class="base_file_upload_list_progress_value">0%</span>' +
                    '       文件大小：<span class="base_file_upload_list_progress_size">'+ t.formatSize(file.size)+'</span>' +
                    '   </div>'+
                    '</div>'
                );
                // $list为容器jQuery实例
                $list.append( $li );
            });
            // 文件上传过程中创建进度条实时显示。
            t.uploader.on( 'uploadProgress', function( file, percentage ) {
                var $li = $( '#'+file.id );
                if(percentage == 1){
                    $li.find(".base_file_upload_list_progress_value").text("100%");
                }else{
                    $li.find(".base_file_upload_list_progress_value").text((percentage * 100 +"").substring(0,2) + '%');
                }
                $li.find('.base_file_upload_list_progress_green').css( 'width', percentage * 100 + '%' );
            });
            // 完成上传完了，成功或者失败。
            t.uploader.on( 'uploadComplete', function( file ) {
                $( '#'+file.id ).addClass('upload_state_done');
            });
            t.uploader.on("uploadAccept",function(obj,ret){  //当所有文件上传结束时触发
                var $li = $("#" + obj.file.id) ,_json = JSON.parse(ret._raw);
                if(_json.result == "true"){
                    iSuccess ++;
                    $li.find(".base_file_upload_list_progress_value").text("上传成功");
                }else if(_json.result == "false"){
                    layer.msg(_json.resultDesc, {offset: 0,shift:6}); //给个错误提示
                    //如果登陆会话已过期，就弹出登陆框
                    if(_json.statusCode && _json.statusCode == "50"){
                        Ajax.showLoginBox();
                    }
                }else{
                    $li.find(".base_file_upload_list_progress_value").text("上传失败");
                }
            });
            //当所有文件上传结束时触发
            t.uploader.on('uploadFinished',function(file){
                if(iNum == iSuccess){
                    layer.msg("所有文件上传完成", {offset: 0});
                }else if(iNum>iSuccess){
                    layer.msg(iSuccess+"个文件上传完成，有"+(iNum-iSuccess)+"个文件上传失败", {offset: 0});
                }
                t.dialog.close().remove();
                $("#table_edit_dialog").find(".table_edit_dialog_left_ul >li").each(function(){
                    if($(this).hasClass("on")){
                        $(this)[0].click();
                    }
                });
            });
        },
        /**
         * 格式化文件大小, 输出成带单位的字符串
         * @method formatSize
         * @grammar Base.formatSize( size ) => String
         * @grammar Base.formatSize( size, pointLength ) => String
         * @grammar Base.formatSize( size, pointLength, units ) => String
         * @param {Number} size 文件大小
         * @param {Number} [pointLength=2] 精确到的小数点数。
         * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.
         * @example
         * console.log( Base.formatSize( 100 ) );    // => 100B
         * console.log( Base.formatSize( 1024 ) );    // => 1.00K
         * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
         * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
         * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
         * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
         */
        formatSize: function( size, pointLength, units ) {
            var unit;
            units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
            while ( (unit = units.shift()) && size > 1024 ) {
                size = size / 1024;
            }
            return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) + unit;
        },
        /**
         * 分割属性，无意义
         * */
        lastProperty:undefined //=========================================最后一项===分割线==================
    }

    module.exports = FileUpload;
});
